from aiogram import Router, types
from aiogram.filters import CommandStart, Command, StateFilter
from aiogram.types import Message
from aiogram.fsm.context import FSMContext
from aiogram.fsm.state import State, StatesGroup
from aiogram import F
import db.etcd as db
import json
from datetime import datetime

router = Router()

class Status(StatesGroup):
    sub = State()
    unsub = State()
    stock = State()
    info = State()

@router.message(CommandStart())
async def cmd_start(message: Message, state: FSMContext):
    name = message.from_user.full_name
    await message.answer(f"Привет, {name}! Здесь вы можете следить за акциями различных компаний, отслеживать их и мгновенно получать информацию о изменениях. Доступна настраиваемая рассылка уведомлений. \n\n"
                         f"Команды бота:"
                         "\n 1. Подписаться на уведомления - /subscribe"
                         "\n 2. Отписаться от уведомлений - /unsubscribe"
                         "\n 3. Посмотреть подписки - /stock"
                         "\n 4. Получить информацию - /getinfo")

@router.message(Command('cancel'))
async def cmd_cancel(message: Message, state: FSMContext):
    await state.clear()
    await message.answer("Действие отменено")

@router.message(Command('subscribe'))
async def cmd_subscribe(message: Message, state: FSMContext):
    await message.answer("Введите интересующую вас акцию")
    await state.set_state(Status.sub)

@router.message(Status.sub, F.text)
async def sub_company(message: Message, state: FSMContext):
    chosen_company = message.text.lower()
    user_id = str(message.from_user.id)
    info_sub = await db.subscribe(user_id, chosen_company)
    if not info_sub:
        await message.answer(f"Вы уже отслеживаете '{chosen_company}'")
    else:
        await message.answer(f"Вы подписались на уведомления по акции {chosen_company}")
    await state.clear()

@router.message(Command('unsubscribe'))
async def cmd_unsubscribe(message: Message, state: FSMContext):
    user_id = str(message.from_user.id)
    if await db.check_stock(user_id):
        await message.answer("Введите компанию, от уведомлений которой хотите отписаться")
        await state.set_state(Status.unsub)
    else:
        await message.answer("Ваш список отслеживаемых компаний пуст. Хотите начать отслеживать? /subscribe")
        await state.clear()

@router.message(Status.unsub, F.text)
async def unsub_company(message: Message, state: FSMContext):
    user_id = str(message.from_user.id)
    company = message.text.lower()
    if await db.unsubscribe(user_id, company):
        await message.answer(f"Компания {company} удалена из вашего списка отслеживаемых.")
        await state.clear()
    else:
        await message.answer(f"Компания '{company}' не найдена в вашем списке отслеживаемых. Проверьте правильность написания и попробуйте снова. /cancel")
        await state.clear()

@router.message(Command('stock'))
async def cmd_stock(message: Message, state: FSMContext):
    user_id = str(message.from_user.id)
    stock = await db.get_stock(user_id)
    if stock:
        message_text = ", ".join(stock)
        await message.answer(f"Ваши отслеживаемые компании: {message_text}")
    else:
        await message.answer("Ваш список отслеживаемых компаний пуст. Хотите начать отслеживать? /subscribe")

@router.message(Command('getinfo'))
async def getinfo(message: Message, state: FSMContext):
    await message.answer("Введите компанию, по которой хотите получить информацию")
    await state.set_state(Status.info)

@router.message(Status.info)
async def info(message: Message, state: FSMContext):
    stock_name = message.text.lower()
    if await db.stock_exists(stock_name):
        latest_pointer = await db.get_latest_pointer(stock_name)
        if latest_pointer:
            feed_pointer = await db.get_feed_by_pointer(latest_pointer)
            if feed_pointer:
                feed_analitic = await db.get_feed_by_pointer(f"{feed_pointer}/processed/label")
                if feed_analitic:
                    summary = await db.get_feed_by_pointer(f"{feed_pointer}/processed/summary")
                    label = await db.get_feed_by_pointer(f"{feed_pointer}/processed/label")
                    link = await db.get_feed_by_pointer(f"{feed_pointer}/link")
                    response = format_response(feed_pointer.split("/")[-1], summary, label, link)
                    await message.answer(response)
                else:
                    await message.answer("Нет аналитических данных для этой акции.")
            else:
                await message.answer("Нет данных по новостям для этой акции.")
        else:
            await message.answer("Нет последних данных по новостям для этой акции.")
    else:
        await message.answer("Акция не найдена в базе данных.")
    await state.clear()

@router.message(StateFilter(Status.sub, Status.unsub, Status.info))
async def reg_company_incorrectly(message: Message, state: FSMContext):
    await message.answer("Это не похоже на название компании. Попробуйте снова или введите /cancel")





def format_response(feed_analytic, summary, label, link):
    # Convert timestamp to human-readable format
    timestamp = datetime.fromtimestamp(int(feed_analytic)).strftime('%Y-%m-%d %H:%M:%S')

    # Map label to smiley
    label_to_smile = {
        'positive': '😊',
        'negative': '😟',
        'neutral': '😐'
    }
    smiley = label_to_smile.get(label.lower(), '😐')

    return (f"Найдена свежая новость от {timestamp}\n"
            f"Влияние на акцию - {label} {smiley}\n"
            f"Ссылка - {link}\n\n"
            f"Краткое содержание:\n{summary}")